#ifndef __BASE_ALG_FUNC_H__
#define __BASE_ALG_FUNC_H__

/**
 * @file nh_base_alg.h
 * @author your name (you@domain.com)
 * @brief 
 * @version 0.1
 * @date 2024-04-09
 * 
 * @copyright Copyright (c) 2024
 * 
 */

#include "stdio.h"
#include "stdlib.h"
#include "stdint.h"
#include "limits.h"
#include "float.h"
#include "math.h"

#define FILTER_BUFFER_SIZE 4

/**
 * @brief 
 * 
 * @param data 
 * @param size 
 */
void InsertionSort_float(float *data, int size);



/**
 * @brief 升序排列
 * 
 * @param data 
 * @param size 
 */
void InsertionSort_uint16(uint16_t *data, int size);


/**
 * @brief 
 * 
 * @param data 
 * @param size 
 */
void InsertionSortuint32(int32_t *data, uint32_t size);


/**
 * @brief 
 * MAX -> MIN
 * @param data 原始数据 list
 * @param size 
 * @param res_arg 
 */

/**
 * @brief 
 * MAX -> MIN
 * @param data 原始数据 list
 * @param shadow_cache  temp临时空间
 * @param size 原始数据 list 长度
 * @param res_arg 结果数组
 */
void argsort(int32_t *data, int32_t *shadow_cache,uint32_t size, int32_t *res_arg);


/**
 * @brief 
 * 
 * @param data 
 * @param size 
 * @return int32_t 
 */
int32_t listmax(int32_t *data,const uint32_t size);

/**
 * @brief 
 * 
 * @param data 
 * @param size 
 * @return int32_t 
 */
int32_t listmin(int32_t *data,const uint32_t size);


uint16_t listmax_uint16( uint16_t *data,const uint32_t size);

uint16_t listmin_uint16( uint16_t *data,const uint32_t size);


/**
 * @brief 
 * 
 * @param input 
 * @param xbuf  buff independce
 * @param ybuf 
 * @return float 
 */
float filter_hr_spo2(float input,float *xbuf,float *ybuf);



/**
 * @brief 
 * 
 * @param data 
 * @param size 
 * @return float 
 */
float find_fmax(float *data,int32_t size);





/**
 * @brief 
 * 
 * @param data 
 * @param size 
 * @return float 
 */
float find_fmin(float *data,int32_t size);


/// 数据拟合并输出
/*!
 @brief   根据选定的范围进行拟合，并计算结果
 @param   x_val 输入序列 长度 3 
 @param   y_val 输出序列 长度 3
 @param   _len  长度 3 使用三阶拟合
 @param   x_in 输入的值
 @return  int 输出的值（不包含状态）
 */
int32_t fitval (int32_t *x_val,int32_t *y_val,int16_t _len,int32_t x_in );

/**
 * @brief 
 * 
 * @param x 
 * @param divided_diff 
 * @param x_val 
 * @param n 
 * @return float 
 */
float newton_divide_diff_interpolate(float x[4], float divided_diff[4], float x_val, int n); 



/**
 * @brief 
 * 
 * @param x 
 * @param y 
 * @param table 
 * @param n 
 */
void compute_divided_differences(float x[4], float y[4], float table[4], int n);



/**
 * @brief mean val
 * 
 * @param data 
 * @param size 
 * @return int32_t 
 */
uint16_t mean_value_uint16(uint16_t *data,int32_t size);


/**
 * @brief 
 * 
 * @param data 
 * @param size 
 * @return float 
 */
float mean_value_float(float *data,int32_t size);




/**
 * @brief 
 * 
 * @param data 
 * @param size 
 * @return float 
 */
uint16_t mean_value_uint16_Weighted(uint16_t *data ,int32_t size);



/**
 * @brief 
 * 
 * @param list_a c传入值会被更改
 * @param len_a 
 * @return int32_t 
 */
int32_t time_valid_check(uint16_t *list_a,uint16_t len_a);



/**
 * @brief 限制变化的速率
 * 
 * @param res   序列 list 
 * @param tick_info 对应的时间tick list
 * @param _len  序列长度
 * @param diff_lim_s  diff_lim: /s
 * @param sample_freq 采样频率
 * @return uint16_t 
 */
uint16_t diff_lim(uint16_t *res, uint32_t *tick_info ,uint16_t _len,const float diff_lim_s ,float sample_freq);


/**
 * @brief 动态生成速率限制的系数
 * 
 * @param curret_hr 当前心率
 * @return float 
 */
float diff_lim_ratio_dynamic(uint16_t curret_hr);



#endif


